package com.storm.queue.thread

import org.slf4j.LoggerFactory
import java.util.concurrent.ExecutorService
import java.util.concurrent.TimeUnit

object ShutdownThread {
    val log = LoggerFactory.getLogger(this.javaClass)

    /**
     * shutdownNow 终止线程的方法是通过调用Thread.interrupt()方法来实现的
     * 如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。
     * 上面的情况中断之后还是可以再执行finally里面的方法的;
     * 但是如果是其他的情况 finally是不会被执行的
     * @param executor
     */
    fun closeExecutor(executor: ExecutorService, executorName: String?) {
        try {
            //新的任务不进队列
            executor.shutdown()
            //给10秒钟没有停止完强行停止;
            if (!executor.awaitTermination(20, TimeUnit.SECONDS)) {
                log.warn("线程池: {},{}没有在20秒内关闭,则进行强制关闭", executorName, executor)
                val droppedTasks = executor.shutdownNow()
                log.warn("线程池: {},{} 被强行关闭,阻塞队列中将有{}个将不会被执行.", executorName, executor, droppedTasks.size)
            }
            log.info("线程池:{},{} 已经关闭...", executorName, executor)
        } catch (e: InterruptedException) {
            log.info("线程池:{},{} 打断...", executorName, executor)
        }
    }

}